package comprasdiretas.beans;

import java.io.IOException;
import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

import comprasdiretas.ejb.FornecedorControllerLocal;
import comprasdiretas.ejb.CompraDiretaControllerLocal;
import comprasdiretas.ejb.PedidoControllerLocal;
import comprasdiretas.ejb.ServidorControllerLocal;
import comprasdiretas.entity.AdministrativoEntity;
import comprasdiretas.entity.FornecedorEntity;
import comprasdiretas.entity.CompraDiretaEntity;
import comprasdiretas.entity.PedidoEntity;
import comprasdiretas.entity.ServidorEntity;
import comprasdiretas.entity.UsuarioEntity;
import comprasdiretas.exception.ObjetoJaCadastradoException;
import comprasdiretas.exception.ParametroNullException;
import comprasdiretas.util.ItemDetalhes;

public class InexigibilidadeDispensaBean {
	private int id;
	private int numero;
	private Date data;
	private int artigo;
	private int fornecedor;
	private String cnpjcpf;
	private int pedido;
	private int servidor;
	private char tipo;
	private char empenhoTipo;
	
	private int novoNumeroDispensa;
	private int novoNumeroInexigibilidade;
	
	private String reitor;
	private String licitacao;
	private String instituicao;
	
	private List<CompraDiretaEntity> listaComprasComElementoNaoDetalhado;
	
	private PedidoBean pedidoBean;
	
	private boolean fornecedorFoiPesquisado = false;
	
	@EJB
	private CompraDiretaControllerLocal compraDiretaController;
	@EJB
	private FornecedorControllerLocal fornecedorController;
	@EJB
	private PedidoControllerLocal pedidoController;
	@EJB
	private ServidorControllerLocal servidorController;
	
	public InexigibilidadeDispensaBean(){
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public int getNumero() {
		return numero;
	}

	public void setNumero(int numero) {
		this.numero = numero;
	}

	public Date getData() {
		return data;
	}
	
	public char getEmpenhoTipo() {
		return empenhoTipo;
	}

	public void setEmpenhoTipo(char empenhoTipo) {
		this.empenhoTipo = empenhoTipo;
	}
	
	public String getAnoCompra() {
		SimpleDateFormat dataFormat = new SimpleDateFormat("yyyy");
		String dataAno = dataFormat.format(data);
		return dataAno;
	}

	public void setData(Date data) {
		this.data = data;
	}
	
	public void setData(java.util.Date dataUtil) {
		java.sql.Date dataSQL = new java.sql.Date(dataUtil.getTime());
		this.data = dataSQL;
	}

	public int getArtigo() {
		return artigo;
	}

	public void setArtigo(int artigo) {
		this.artigo = artigo;
	}

	public int getFornecedor() {
		return fornecedor;
	}
	
	public FornecedorEntity getFornecedorEntity(){
		FornecedorEntity fornecedorEntity = fornecedorController.consultarFornecedor(fornecedor);
		if (fornecedorEntity==null) {
			fornecedorEntity = new FornecedorEntity();
		}
		return fornecedorEntity;
	}
	
	public FornecedorEntity getFornecedorEntityPeloCNPJCPF(){
		FornecedorEntity fornecedorEntity = fornecedorController.consultarFornecedor(cnpjcpf);
		if (fornecedorEntity==null) {
			fornecedorEntity = new FornecedorEntity();
		}
		return fornecedorEntity;
	}

	public List<CompraDiretaEntity> getInexigibilidadesDispensas(){
		NomeConsultaInexigibilidadeDispensaBean nomeConsultaInexigibilidadeDispensa = (NomeConsultaInexigibilidadeDispensaBean)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("nomeConsultaInexigibilidadeDispensaBean");
		List<CompraDiretaEntity> inexigibilidadesDispensasEntity = new ArrayList<CompraDiretaEntity>();
		int numero;
		char tipo;
		Date dataInicio;
		Date dataFim;
		if (nomeConsultaInexigibilidadeDispensa==null) {
			inexigibilidadesDispensasEntity = compraDiretaController.listarInexigibilidadeDispensa();
		}else {
			//Valida��o 
			if (nomeConsultaInexigibilidadeDispensa.getNumero()==null) {
				numero=0;
			}else{
				numero = nomeConsultaInexigibilidadeDispensa.getNumero();	
			}
			
			if (nomeConsultaInexigibilidadeDispensa.getTipo()==null) {
				tipo='t';
			}else{
				tipo = nomeConsultaInexigibilidadeDispensa.getTipo();	
			}
			
			if (nomeConsultaInexigibilidadeDispensa.getDataInicio()==null) {
				dataInicio = null;
			} else {
				dataInicio = new Date(nomeConsultaInexigibilidadeDispensa.getDataInicio().getTime());
			}
			if (nomeConsultaInexigibilidadeDispensa.getDataFim()==null) {
				dataFim=null;
			} else {
				dataFim = new Date(nomeConsultaInexigibilidadeDispensa.getDataFim().getTime());
			}
			
			//Fim da Valida��o 
			
			if (dataInicio!=null&&dataFim!=null&&tipo!='t'&&numero>0) {
				inexigibilidadesDispensasEntity = compraDiretaController.consultaInexigibilidadeDispensa(dataInicio, dataFim, numero,tipo);	
			}else{
				if (dataInicio==null||dataFim==null) {
					if (numero>0&&tipo!='t') {
							inexigibilidadesDispensasEntity = compraDiretaController.consultaInexigibilidadeDispensa(numero,tipo);	
					}else{ 
						if (numero>0&&tipo=='t'){ 
							inexigibilidadesDispensasEntity = compraDiretaController.consultaInexigibilidadeDispensa(numero);
						}else{
							inexigibilidadesDispensasEntity = compraDiretaController.consultaInexigibilidadeDispensa(tipo);
						}
					}
				}else{
					if (tipo=='t') {
						inexigibilidadesDispensasEntity = compraDiretaController.consultaInexigibilidadeDispensa(dataInicio, dataFim);
					}else
						inexigibilidadesDispensasEntity = compraDiretaController.consultaInexigibilidadeDispensa(dataInicio, dataFim, tipo);
				}
				
			}
		}
	
		return inexigibilidadesDispensasEntity;
	}
	
	public void setFornecedor(int fornecedor) {
		this.fornecedor = fornecedor;
	}

	public int getPedido() {
		return pedido;
	}
	
	public PedidoEntity getPedidoEntity() {
		PedidoEntity pedidoEntity = pedidoController.consultaPedidoEntity(pedido);
	
		return pedidoEntity;
	}

	public void setPedido(int pedido) {
		this.pedido = pedido;
	}

	public int getServidor() {
		return servidor;
	}

	public void setServidor(int servidor) {
		this.servidor = servidor;
	}

	public char getTipo() {
		return tipo;
	}

	public void setTipo(char tipo) {
		this.tipo = tipo;
	}
	
	public String getTipoNome(){
		if (tipo=='d') {
			return "Dispensa";
		}else{
			return "Inexigibilidade";
		}
	}
	
	public String getReitor() {
		return reitor;
	}

	public void setReitor(String reitor) {
		this.reitor = reitor;
	}

	public String getLicitacao() {
		return licitacao;
	}

	public void setLicitacao(String licitacao) {
		this.licitacao = licitacao;
	}

	public String getInstituicao() {
		return instituicao;
	}

	public void setInstituicao(String instituicao) {
		this.instituicao = instituicao;
	}

	public int getNovoNumeroDispensa() {
		return novoNumeroDispensa;
	}

	public void setNovoNumeroDispensa(int novoNumeroDispensa) {
		this.novoNumeroDispensa = novoNumeroDispensa;
	}

	public int getNovoNumeroInexigibilidade() {
		return novoNumeroInexigibilidade;
	}
	
	

	public List<CompraDiretaEntity> getListaComprasComElementoNaoDetalhado() {
		return listaComprasComElementoNaoDetalhado;
	}

	public void setNovoNumeroInexigibilidade(int novoNumeroInexigibilidade) {
		this.novoNumeroInexigibilidade = novoNumeroInexigibilidade;
	}

	public String convidaFornecedor(){
		try{
			FornecedorEntity fornecedorEntity = fornecedorController.consultarFornecedor(cnpjcpf);
			if (fornecedorEntity==null) {
				throw new Exception("Fornecedor com CNPJ ou CPF "+cnpjcpf+" n�o localizado.");
			}
			this.fornecedor=fornecedorEntity.getId();
		} catch (Exception e) {
			e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,e.getMessage(),e.getMessage()));
			limparCampos();
			return "erro";
		}
		return "avancar";
	}
	
	public String cadastraInexigibilidadeDispensa(){
		try {
			//Verifica se j� existe Dispensa/Inexigibilidade cadastada com o n�mero atual
			boolean jaCadastrada = false;
			jaCadastrada = compraDiretaController.numeroCompraDiretaJaCadastrado(tipo);
			if (jaCadastrada) {
				if (tipo=='d') {
					throw new Exception("J� existe Dispensa cadastrada com n�mero "+compraDiretaController.getNumeroDispensa()+". Altere o n�mero da Dispensa ou Exclua a j� existente.");	
				}else{
					throw new Exception("J� existe Inexigibilidade cadastrada com n�mero "+compraDiretaController.getNumeroInexigibilidade()+". Altere o n�mero da Inexigibilidade ou Exclua a j� existente.");
				}
			}
			
			if (pedidoBean==null) {
				throw new Exception("Problemas com o pedido.O pedido n�o est� na sess�o.");
			}
			//Cadastra dados do pedido
			String pedidoOk = pedidoBean.cadastraPedido();
			if (pedidoOk!=null&&pedidoOk.equals("erro")) {
				throw new Exception("O pedido n�o p�de ser salvo");
			}
			pedido=pedidoBean.getNumPedido();
			HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
			UsuarioEntity usuarioLogado = (UsuarioEntity) session.getAttribute("logado");
			if (usuarioLogado==null) {
				throw new Exception("Usu�rio n�o logado no sistema");
			}
			ServidorEntity servidorEntity = getServidorDeUsuario(usuarioLogado.getLogin());
			if (servidorEntity==null) {
				throw new Exception("Servidor inv�lido");
			}
			setData(pedidoBean.getData());
			//Cadastra dados da compra direta
			numero = compraDiretaController.cadastrarInexigibilidadeDispensa(data, artigo, fornecedor, pedido, servidorEntity.getIdServidor(), tipo, empenhoTipo );
			CompraDiretaEntity compraDiretaEntity = compraDiretaController.getCompraDireta(numero, data);
			if (compraDiretaEntity==null) {
				throw new Exception("Compra Direta n�o cadastrada corretamente.");
			}
			id = compraDiretaEntity.getId();
			//Cadastra itens para a compra direta
			cadastraItensCompraDireta(pedidoBean.getItensDetalhesMap());
		
		} catch (ParametroNullException e) {
			e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,e.getMessage(),e.getMessage()));
			limparCampos();
			return "erro";
		} catch (ObjetoJaCadastradoException e) {
			e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,e.getMessage(),e.getMessage()));
			limparCampos();
			return "erro";
		} catch (Exception e) {
			e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,e.getMessage(),e.getMessage()));
			limparCampos();
			return "erro";
		}
		FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Cadastro Realizado com Sucesso","Cadastro Realizado com Sucesso"));
		return "ok";
	}
	
	private void limparCampos(){
		id=0;
		numero=0;
		data=new Date(System.currentTimeMillis());
		fornecedor=0;
		pedido=0;
		servidor=0;
		tipo=0;
	}
	
	public String prepararCadastarInexigibilidadeDispensa(){
		id=0;
		numero=0;
		data=new Date(System.currentTimeMillis());
		fornecedor=0;
		pedido=0;
		servidor=0;
		tipo=0;
		
		return "CadastrarPedido";
	}

	public void setCnpjcpf(String cnpjcpf) {
		this.cnpjcpf = cnpjcpf;
	}

	public String getCnpjcpf() {
		return cnpjcpf;
	}
	
	public String selecionarFornecedor(){
		try {
			FornecedorEntity fornecedorSelecionado = (FornecedorEntity) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get("fornecedorPesquisado");
			this.cnpjcpf = fornecedorSelecionado.getCnpjcpf();
		} catch (Exception e) {
			e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,e.getMessage(),e.getMessage()));
			limparCampos();
			return "erro";
		}
		this.fornecedorFoiPesquisado=false;
		return "retornar";
	}

	public void setFornecedorFoiPesquisado(boolean fornecedorFoiPesquisado) {
		this.fornecedorFoiPesquisado = fornecedorFoiPesquisado;
	}

	public boolean isFornecedorFoiPesquisado() {
		return fornecedorFoiPesquisado;
	}
	
	public String pesquisarFornecedorPeloNome(){
		this.fornecedorFoiPesquisado=true;
		
		return "pesquisarFornecedorPeloNome";
	}
	
	public String consultaInexigibilidadeDispensa(){
		return "resultadoConsultaInexigibilidadeDispensa";
	}
	
	public String preparaAlteraInexigibilidadeDispensa(){
		try {
			CompraDiretaEntity InexigibilidadeDispensaSelecionada = (CompraDiretaEntity) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get("compraDireta");
			if (InexigibilidadeDispensaSelecionada==null) {
				throw new Exception("Nenhuma Inexigibilidade/Dispensa foi selecionada para altera��o.");
			}
			
			//Popular os dados da inexigibilidadeSelecionada
			id=InexigibilidadeDispensaSelecionada.getId();
			numero=InexigibilidadeDispensaSelecionada.getNumero();
			data=InexigibilidadeDispensaSelecionada.getData();
			artigo=InexigibilidadeDispensaSelecionada.getArtigoLei();
			fornecedor=InexigibilidadeDispensaSelecionada.getFornecedorVencedor().getId();
			cnpjcpf=InexigibilidadeDispensaSelecionada.getFornecedorVencedor().getCnpjcpf();
			pedido=InexigibilidadeDispensaSelecionada.getPedido().getId().getNumPedido();
			servidor=InexigibilidadeDispensaSelecionada.getServidor().getIdServidor();
			tipo=InexigibilidadeDispensaSelecionada.getTipo();
			empenhoTipo=InexigibilidadeDispensaSelecionada.getEmpenhoTipo();
			
			PedidoEntity pedidoEntityAtual = InexigibilidadeDispensaSelecionada.getPedido();
			if (pedidoEntityAtual==null) {
				throw new Exception("N�o existe pedido associado a Inexigibilidade "+InexigibilidadeDispensaSelecionada.getNumero());
			}
			HashMap<String, ItemDetalhes> itensCompraDireta = compraDiretaController.getItens(InexigibilidadeDispensaSelecionada);
						
			pedidoBean.setNumPedido(pedidoEntityAtual.getId().getNumPedido());
			pedidoBean.setFonte(pedidoEntityAtual.getFonte());
			pedidoBean.setProcesso(pedidoEntityAtual.getProcesso());
			pedidoBean.setPtres(pedidoEntityAtual.getPtres());
			pedidoBean.setElementoDespesa(pedidoEntityAtual.getElementoDespesa());
			pedidoBean.setData(pedidoEntityAtual.getData());
			pedidoBean.setItensDetalhes(itensCompraDireta);
			
			
		} catch (Exception e) {
			e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,e.getMessage(),e.getMessage()));
			limparCampos();
			return "erro";
		}
		return "alterarInexigibilidadeDispensa";
	}
	
	public String preparaDetalhaInexigibilidadeDispensa(){
		try {
			CompraDiretaEntity InexigibilidadeDispensaSelecionada = (CompraDiretaEntity) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get("compraDireta");
			if (InexigibilidadeDispensaSelecionada==null) {
				throw new Exception("Nenhuma Inexigibilidade/Dispensa foi selecionada para altera��o.");
			}
			
			//Popular os dados da inexigibilidadeSelecionada
			id=InexigibilidadeDispensaSelecionada.getId();
			numero=InexigibilidadeDispensaSelecionada.getNumero();
			data=InexigibilidadeDispensaSelecionada.getData();
			artigo=InexigibilidadeDispensaSelecionada.getArtigoLei();
			fornecedor=InexigibilidadeDispensaSelecionada.getFornecedorVencedor().getId();
			cnpjcpf=InexigibilidadeDispensaSelecionada.getFornecedorVencedor().getCnpjcpf();
			pedido=InexigibilidadeDispensaSelecionada.getPedido().getId().getNumPedido();
			servidor=InexigibilidadeDispensaSelecionada.getServidor().getIdServidor();
			tipo=InexigibilidadeDispensaSelecionada.getTipo();
			empenhoTipo=InexigibilidadeDispensaSelecionada.getEmpenhoTipo();
			
			PedidoEntity pedidoEntityAtual = InexigibilidadeDispensaSelecionada.getPedido();
			if (pedidoEntityAtual==null) {
				throw new Exception("N�o existe pedido associado a Inexigibilidade "+InexigibilidadeDispensaSelecionada.getNumero());
			}
			
			if (pedidoBean==null) {
				throw new Exception("Nunhum pedido associado a Inexigibilidade "+InexigibilidadeDispensaSelecionada.getNumero());
			}
						
			pedidoBean.setData(pedidoEntityAtual.getData());
			pedidoBean.setElementoDespesa(pedidoEntityAtual.getElementoDespesa());
			pedidoBean.setFonte(pedidoEntityAtual.getFonte());
			pedidoBean.setNumPedido(pedidoEntityAtual.getId().getNumPedido());
			pedidoBean.setProcesso(pedidoEntityAtual.getProcesso());
			pedidoBean.setPtres(pedidoEntityAtual.getPtres());
			HashMap<String, ItemDetalhes> itens = compraDiretaController.getItens(InexigibilidadeDispensaSelecionada);
			pedidoBean.setItensDetalhes(itens);
			
			
		} catch (Exception e) {
			e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,e.getMessage(),e.getMessage()));
			limparCampos();
			return "erro";
		}
		return "detalharInexigibilidadeDispensa";
	}
	
	public String preparaDetalhaElementoDespesa(){
		try {
			CompraDiretaEntity InexigibilidadeDispensaSelecionada = (CompraDiretaEntity) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get("compraDireta");
			if (InexigibilidadeDispensaSelecionada==null) {
				throw new Exception("Nenhuma Inexigibilidade/Dispensa foi selecionada para altera��o.");
			}
			
			//Popular os dados da inexigibilidadeSelecionada
			id=InexigibilidadeDispensaSelecionada.getId();
			numero=InexigibilidadeDispensaSelecionada.getNumero();
			data=InexigibilidadeDispensaSelecionada.getData();
			artigo=InexigibilidadeDispensaSelecionada.getArtigoLei();
			fornecedor=InexigibilidadeDispensaSelecionada.getFornecedorVencedor().getId();
			cnpjcpf=InexigibilidadeDispensaSelecionada.getFornecedorVencedor().getCnpjcpf();
			pedido=InexigibilidadeDispensaSelecionada.getPedido().getId().getNumPedido();
			servidor=InexigibilidadeDispensaSelecionada.getServidor().getIdServidor();
			tipo=InexigibilidadeDispensaSelecionada.getTipo();
			empenhoTipo=InexigibilidadeDispensaSelecionada.getEmpenhoTipo();
			
			PedidoEntity pedidoEntityAtual = InexigibilidadeDispensaSelecionada.getPedido();
			if (pedidoEntityAtual==null) {
				throw new Exception("N�o existe pedido associado a Inexigibilidade "+InexigibilidadeDispensaSelecionada.getNumero());
			}
			
			if (pedidoBean==null) {
				throw new Exception("Nunhum pedido associado a Inexigibilidade "+InexigibilidadeDispensaSelecionada.getNumero());
			}
						
			pedidoBean.setElementoDespesa(pedidoEntityAtual.getElementoDespesa());
			pedidoBean.setNumPedido(pedidoEntityAtual.getId().getNumPedido());
			
		} catch (Exception e) {
			e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,e.getMessage(),e.getMessage()));
			limparCampos();
			return "erro";
		}
		return "detalharInexigibilidadeDispensa";
	}
	
	public String alteraInexigibilidadeDispensa(){
		try {
			
			if (pedidoBean==null) {
				throw new Exception("Problemas com o pedido. O pedido n�o est� na sess�o.");
			}
			pedidoController.atualizaPedidoEntity(pedidoBean.getNumPedido(), pedidoBean.getProcesso(),
					pedidoBean.getFonte(), pedidoBean.getPtres(),data, pedidoBean.getElementoDespesa());
			
			compraDiretaController.atualizaInexigibilidadeDispensa(id,data, artigo, fornecedor, pedido, servidor, empenhoTipo, pedidoBean.getItensDetalhesMap());
		   	
		} catch (Exception e) {
			e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,e.getMessage(),e.getMessage()));
			limparCampos();
			return "erro";
		}
		FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Altera��o realizada com Sucesso.","Altera��o realizada com Sucesso."));
		return "ok";
	}
	
	public String excluiInexigibilidadeDispensa(){
		try {
			CompraDiretaEntity InexigibilidadeDispensaSelecionada = (CompraDiretaEntity) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get("compraDireta");
			if (InexigibilidadeDispensaSelecionada==null) {
				throw new Exception("Nenhuma Inexigibilidade/Dispensa foi selecionada para remo��o.");
			}
			compraDiretaController.removerInexigibilidadeDispensa(InexigibilidadeDispensaSelecionada);
			
		} catch (Exception e) {
			e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,e.getMessage(),e.getMessage()));
			limparCampos();
			return "erro";
		}
		FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Inexigibilidade/Dispensa removida com sucesso.","Inexigibilidade/Dispensa removida com sucesso."));
		return "resultadoConsultaInexigibilidadeDispensa";
	}
	
	public String listarTodasInexigibilidadesDispensas(){
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("nomeConsultaInexigibilidadeDispensaBean", null);
		return "resultadoConsultaInexigibilidadeDispensa";
	}
	
	public AdministrativoEntity getAdministrativo(){
		AdministrativoEntity administrativo = compraDiretaController.consultaDadosAdministrativos();
		return administrativo;
	}
	
	public String imprimirQuadroResumo(){
		
		FacesContext facesContext = FacesContext.getCurrentInstance();
		
		ServletContext servletContext = (ServletContext)facesContext.getExternalContext().getContext();
		//obtem o caminho para o arquivo do relat�rio .jasper
		String pathRel = servletContext.getRealPath("/seguro/relatorios/QuadroResumo.jasper");

        // pegando o response do contexto do faces
        HttpServletResponse response = (HttpServletResponse) facesContext
                .getExternalContext().getResponse();

        // definindo que o mime-type ser� PDF
        response.setContentType("application/pdf");

        // definindo que a disposi��o do conte�do ser� inline (dentro do
        // pr�prio browser) e o nome do arquivo ser� arquivo.pdf
        response.setHeader("Content-disposition", "inline; filename=\"QuadroResumo.pdf\"");

        try {

        	// definindo o mapeamento com os parametros do relat�rio
        	Map<String, Object> parametrosRelatorio = new HashMap<String, Object>();
        	AdministrativoEntity administrativo = getAdministrativo();
        	if (administrativo==null) {
				throw new Exception("N�o foi possivel carregar os dados administrativos.");
			}
        	parametrosRelatorio.put("instituicao", administrativo.getInstituicao());
        	parametrosRelatorio.put("reitor", administrativo.getReitor());
        	parametrosRelatorio.put("licitacao", administrativo.getLicitacao());
        	String tipoCompra="";
        	if (getTipo()=='d') {
        		tipoCompra="Dispensa";
			}else{
				tipoCompra="Inexigibilidade";
			}
        	parametrosRelatorio.put("tipoCompraDireta", tipoCompra);
        	String numeroCompra = Integer.toString(numero)+" / "+getAnoCompra();
        	parametrosRelatorio.put("numeroCompra",numeroCompra);
        	       	
            // definindo o DataSoure a partir de uma cole��o
			if (pedidoBean==null) {
				throw new Exception("Problemas com o pedido. O pedido n�o est� na sess�o.");
			}
			parametrosRelatorio.put("pedido",Integer.toString(pedidoBean.getNumPedido()));
			parametrosRelatorio.put("processo",pedidoBean.getProcesso());
			parametrosRelatorio.put("ptres",pedidoBean.getPtres());
			parametrosRelatorio.put("fonte",pedidoBean.getFonte());
			parametrosRelatorio.put("elementoDespesa",pedidoBean.getElementoDespesa());
			parametrosRelatorio.put("valorPorExtenso",pedidoBean.getValorTotalPorExtenso().toUpperCase());
			parametrosRelatorio.put("valorTotal",pedidoBean.getValorTotal());
			parametrosRelatorio.put("dataPedido",pedidoBean.getData());
			
			FornecedorEntity fornecedorConvidado = getFornecedorEntityPeloCNPJCPF();
			if (fornecedorConvidado==null) {
				throw new Exception("Fornecedor convidado n�o localizado.");
			}
			parametrosRelatorio.put("empresaNome",fornecedorConvidado.getNome());
			parametrosRelatorio.put("cnpjcpf",fornecedorConvidado.getCnpjcpf());
			String tipoCadastroFornecedor = (fornecedorConvidado.getTipo()=='f')?"CPF:":"CNPJ:";
			parametrosRelatorio.put("cnpjcpfRotulo",tipoCadastroFornecedor);
			parametrosRelatorio.put("endereco",fornecedorConvidado.getEndereco());
			parametrosRelatorio.put("bairro",fornecedorConvidado.getBairro());
			parametrosRelatorio.put("cidade",fornecedorConvidado.getCidade());
			parametrosRelatorio.put("estado",fornecedorConvidado.getEstado());
			parametrosRelatorio.put("cep",fornecedorConvidado.getCep());
			String empenhoTipoNome ="";
			if (empenhoTipo=='g') {
				empenhoTipoNome="GLOBAL";
			}else if (empenhoTipo=='o') {
				empenhoTipoNome="ORDIN�RIO";
			}else if (empenhoTipo=='e') {
				empenhoTipoNome="ESTIMATIVO";
			}
			parametrosRelatorio.put("tipoEmpenho",empenhoTipoNome);
			parametrosRelatorio.put("artigoLei",Integer.toString(artigo));
			
			List<ItemDetalhes> itensDetalhes = pedidoBean.getItensDetalhesList();
			if (itensDetalhes==null) {
				throw new Exception("Nenhum item foi localizado para o pedido em quest�o.");
			}
			JRBeanCollectionDataSource dsColecao = new JRBeanCollectionDataSource(itensDetalhes);

            // criando a impressora Jasper a partir do caminho para o arquivo .jasper,
            // dos atributos (um Map que pode ser passado ao retalorio e cujos valores podem ser acessados como paramentros no relatorio)
            // e da DataSource (definida a partir da Colecao dados)
            JasperPrint impressoraJasper = JasperFillManager.fillReport(pathRel, parametrosRelatorio, dsColecao);
           
            // pegando o stream que ser� utilizado na sa�da
            ServletOutputStream streamDeSaida = response.getOutputStream();

            // exportando o relat�rio em formato PDF para a sa�da
            JasperExportManager.exportReportToPdfStream(impressoraJasper, streamDeSaida);

        } catch (JRException e) {
        	e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,e.getMessage(),e.getMessage()));
			limparCampos();
			return "erro";
        } catch (IOException e) {
        	e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,e.getMessage(),e.getMessage()));
			limparCampos();
			return "erro";
        } catch (Exception e) {
        	e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,e.getMessage(),e.getMessage()));
			limparCampos();
			return "erro";
		}

        // definindo que a resposta ao contexto do faces est� completa
        facesContext.responseComplete();
		
		return "ok";
	}
	
	public String preparaAdministrativo(){
		try {
			AdministrativoEntity administrativoEntity = compraDiretaController.consultaDadosAdministrativos();
			if (administrativoEntity==null) {
				throw new Exception("Nenhuma dado administrativo foi localizado.");
			}
			
			//Popular os dados administrativos
			
			novoNumeroDispensa = compraDiretaController.getNumeroDispensa();
			novoNumeroInexigibilidade = compraDiretaController.getNumeroInexigibilidade();
			
			reitor = administrativoEntity.getReitor();
			licitacao = administrativoEntity.getLicitacao();
			instituicao = administrativoEntity.getInstituicao();
			

		} catch (Exception e) {
			e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,e.getMessage(),e.getMessage()));
			limparCampos();
			return "erro";
		}
		return "AlterarAdministrativo";
	}
	
	public String alterarDadosAdministrativos(){
		try {
			compraDiretaController.alteraDadosAdministrativos(instituicao, reitor, licitacao);
			
			compraDiretaController.setNumeroDispensa(novoNumeroDispensa);
			compraDiretaController.setNumeroInexigibilidade(novoNumeroInexigibilidade);
		   	
		} catch (Exception e) {
			e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,e.getMessage(),e.getMessage()));
			limparCampos();
			return "erro";
		}
		FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Altera��o realizada com Sucesso.","Altera��o realizada com Sucesso."));
		return "ok";
	}
	
	private ServidorEntity getServidorDeUsuario(String login){
		ServidorEntity servidor = servidorController.consultaServidor(login);
		return servidor;
	}

	public void setPedidoBean(PedidoBean pedidoBean) {
		this.pedidoBean = pedidoBean;
	}

	public PedidoBean getPedidoBean() {
		return pedidoBean;
	}
	
	public String verificaCompraComElementoNaoDetalhado(){
		
		listaComprasComElementoNaoDetalhado=null;
		try {
			listaComprasComElementoNaoDetalhado = this.compraDiretaController.consultaComprasComElementosNaoDetalhados();
		} catch (Exception e) {
			e.printStackTrace();
		}
		if (listaComprasComElementoNaoDetalhado==null||listaComprasComElementoNaoDetalhado.isEmpty()) {
			return "ConsultarSaldosElementosDespesa";
		}
		return "DetalhaElementos";
	}
	
	private String cadastraItensCompraDireta(HashMap<String,ItemDetalhes> itens){
		try {
			
			compraDiretaController.cadastraItensCompraDireta(id, itens);
			
		} catch (Exception e) {
			e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,e.getMessage(),e.getMessage()));
			limparCampos();
			return "erro";
		}
		FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Cadastro Realizado com Sucesso","Cadastro Realizado com Sucesso"));
		return "ok";
	}
		
}
